水無瀬の部屋 > Programming > sample > goddess > goddess.cpp |
---|
1: //*********************************************************
2: // プロジェクト: ああっ壁神さまっ
3: // ファイル名: goddess.cpp
4: //*********************************************************
5: #include "goddess.h"
6: #include "cmdline.h"
7: #include "instdlg.h" //
8: #include <relation/relation.h>
9: #include <susie/susie.h>
10:
11:
12: //---------------------------------------------------------
13: // テスト関数 の 宣言
14: //---------------------------------------------------------
15: DECLARE_TESTPROC( test_cmdline );
16:
17:
18: //---------------------------------------------------------
19: // マクロ定数 の 定義
20: //---------------------------------------------------------
21: //
22: #define MUTEX_INSTALLDLG ( "goddess.InstallDlg" )
23: //
24: #define MODE_GODDESS ( 1 ) //
25: #define MODE_INSTALL ( 2 ) // インストール
26: #define REGPATH_CONTROLPANEL_DESKTOP "Control Panel\\desktop" //
27: //
28: #define PARAM_CENTER "/center"
29: #define PARAM_TILE "/tile"
30: #define PARAM_ZOOM "/zoom"
31:
32:
33: //---------------------------------------------------------
34: // ファイルスコープ関数 の 宣言
35: //---------------------------------------------------------
36: static int GetApplicationMode( int argc, char **argv );
37: static int CommandLineApplicationMainProc( HINSTANCE hInstance, int argc, char **argv );
38: static int ApplicationInstallMainProc( HINSTANCE hInstance, int argc, char **argv );
39:
40:
41: //---------------------------------------------------------
42: // ファイルスコープ変数 の 定義
43: //---------------------------------------------------------
44: static const struct
45: {
46: const char *param;
47: const char *style;
48: const char *tiling;
49: }
50: params[] =
51: {
52: { PARAM_CENTER, "0", "0" }, // 中央
53: { PARAM_TILE, "0", "1" }, // 並べて
54: { PARAM_ZOOM, "2", "0" }, // 拡大
55: };
56:
57:
58: //*********************************************************
59: // ApplicationMainProc
60: //*********************************************************
61: int
62: ApplicationMainProc
63: (
64: HINSTANCE hInstance,
65: int argc,
66: char **argv
67: )
68: {
69: // パラメタの仮定
70: ASSERT( IsValidInstanceHandle( hInstance ) );
71: ASSERT( IsValidArgcArgv( argc, argv ) );
72: ASSERT( IsPathMyself( argv[ 0 ] ) ); // 自分自身
73:
74: //
75: const int mode = GetApplicationMode( argc, argv );
76: switch( mode )
77: {
78: default: return EXIT_FAILURE;
79: case MODE_GODDESS: return CommandLineApplicationMainProc( hInstance, argc, argv );
80: case MODE_INSTALL: return ApplicationInstallMainProc( hInstance, argc, argv );
81: }
82: }//ApplicationMainProc
83:
84:
85: //******************************************************************************************************************
86: // private
87: //******************************************************************************************************************
88: //*********************************************************
89: // GetApplicationMode
90: //*********************************************************
91: static
92: int
93: GetApplicationMode
94: (
95: int argc,
96: char **argv
97: )
98: {
99: // パラメタの仮定
100: ASSERT( IsValidArgcArgv( argc, argv ) );
101: ASSERT( IsPathMyself( argv[ 0 ] ) ); // 自分自身
102:
103: // 引数が無ければ 設定 モード
104: return (1 < argc) ? MODE_GODDESS : MODE_INSTALL ;
105: }//GetApplicationMode
106:
107:
108: //******************************************************************************************************************
109: // private - MODE_INSTALL
110: //******************************************************************************************************************
111: //*********************************************************
112: // ApplicationInstallMainProc
113: //*********************************************************
114: static
115: int
116: ApplicationInstallMainProc
117: (
118: HINSTANCE hInstance,
119: int argc,
120: char **argv
121: )
122: {
123: // パラメタの仮定
124: ASSERT( IsValidInstanceHandle( hInstance ) );
125: ASSERT( IsValidArgcArgv( argc, argv ) );
126: ASSERT( IsPathMyself( argv[ 0 ] ) ); // 自分自身
127:
128: //
129: HANDLE hMutex = CreateMutexOnce( MUTEX_INSTALLDLG );
130: if ( hMutex )
131: {
132: InstallDlg( HWND_DESKTOP );
133: VERIFY( CloseHandle( hMutex ) );
134: }
135:
136: return EXIT_SUCCESS;
137: }//ApplicationInstallMainProc
138:
139:
140: //******************************************************************************************************************
141: // private - MODE_GODDESS
142: //******************************************************************************************************************
143: static bool ParseCmdLine( WALLPAPAER_t *pwp, int argc, char **argv );
144:
145:
146: //*********************************************************
147: // CommandLineApplicationMainProc
148: //*********************************************************
149: static
150: int
151: CommandLineApplicationMainProc
152: (
153: HINSTANCE hInstance,
154: int argc,
155: char **argv
156: )
157: {
158: // パラメタの仮定
159: ASSERT( IsValidInstanceHandle( hInstance ) );
160: ASSERT( IsValidArgcArgv( argc, argv ) );
161: ASSERT( IsPathMyself( argv[ 0 ] ) ); // 自分自身
162:
163:
164: // 希望する壁紙・壁紙モードの取得
165: WALLPAPAER_t wp;
166: if ( !ParseCmdLine( &wp, argc, argv ) )
167: {
168: return 0;
169: }
170:
171: // Susie plug-in を見つける
172: char susie[ MAX_PATH_BUF ];
173: VERIFY( GetSusiePluginPath( susie, sizeof(susie) ) );
174: if ( !IsPathExist( susie ) )
175: {
176: GetModuleFileLocation( susie, numof(susie) );
177: }
178:
179: // 壁紙・壁紙モードの変更作業
180: HKEY hkeyCplDesktop;
181: if ( OpenRegKey( HKEY_CURRENT_USER, REGPATH_CONTROLPANEL_DESKTOP, KEY_ALL_ACCESS, &hkeyCplDesktop ) )
182: {
183: // 現状の保存
184: WALLPAPAER_t wpOld;
185: RegGetWallPaperInfo( hkeyCplDesktop, &wpOld );
186:
187: // 壁紙・壁紙モードの変更
188: // 変更失敗時には Windows の設定が無効になるので、
189: // 元の状態に戻すのはプログラムの責任。
190: RegSetWallPaperMode( hkeyCplDesktop, &wp );
191: if ( !SetWallPaperFileEx( wp.FileName, SPIF_UPDATEINIFILE | SPIF_SENDWININICHANGE, susie ) )
192: {
193: // 壁紙・壁紙モードの復帰
194: RegSetWallPaperMode( hkeyCplDesktop, &wpOld );
195: VERIFY( SetWallPaperFile( wpOld.FileName, SPIF_UPDATEINIFILE | SPIF_SENDWININICHANGE ) );
196: }
197: VERIFY( CloseRegKey( hkeyCplDesktop ) );
198: }
199:
200: return EXIT_SUCCESS;
201: }//CommandLineApplicationMainProc
202:
203:
204: //******************************************************************************************************************
205: //
206: //******************************************************************************************************************
207: //*********************************************************
208: // ParseCmdLine
209: //*********************************************************
210: static
211: bool
212: ParseCmdLine
213: (
214: WALLPAPAER_t *wp,
215: int argc,
216: char **argv
217: )
218: {
219: CALLONCE_TESTPROC( test_cmdline ); // [テスト]
220:
221: // パラメタの仮定
222: ASSERT( IsValidPtr( wp, sizeof( *wp ) ) );
223: ASSERT( IsValidArgcArgv( argc, argv ) );
224: ASSERT( IsPathMyself( argv[ 0 ] ) ); // 自分自身
225:
226: // 初期値
227: memzero( wp, sizeof( *wp ) );
228: strcopy( wp->Style, numof(wp->Style), "0" );
229: strcopy( wp->Tiling, numof(wp->Tiling), "0" );
230: strcopy( wp->FileName, numof(wp->FileName), "" );
231:
232: // 現状の取得
233: HKEY hkeyCplDesktop;
234: if ( OpenRegKey( HKEY_CURRENT_USER, REGPATH_CONTROLPANEL_DESKTOP, KEY_ALL_ACCESS, &hkeyCplDesktop ) )
235: {
236: RegGetWallPaperInfo( hkeyCplDesktop, wp );
237: VERIFY( CloseRegKey( hkeyCplDesktop ) );
238: }
239:
240: // 引数に従って初期化
241: {for( int i = 1; i < argc; ++i )
242: {
243: ASSERT( IsValidStringPtr( argv[ i ] ) );
244:
245: if ( IsPathFile( argv[ i ] ) )
246: {
247: strcopy( wp->FileName, numof(wp->FileName), argv[i] );
248: }
249: else
250: {
251: // 表示方法の指定があれば
252: {for( int j = 0; j < numof(params); ++j )
253: {
254: if ( streqli( argv[ i ], params[ j ].param ) )
255: {
256: strcopy( wp->Style, numof(wp->Style), params[ j ].style );
257: strcopy( wp->Tiling, numof(wp->Tiling), params[ j ].tiling );
258: }
259: }}
260: }
261: }}
262:
263: return (1 < argc) && IsPathExist( wp->FileName );
264: }//ParseCmdLine
265:
266:
267: //******************************************************************************************************************
268: // TEST
269: //******************************************************************************************************************
270:
271:
272: #ifdef _DEBUG // デバッグ時のみ
273:
274:
275: //*********************************************************
276: // test_cmdline
277: //*********************************************************
278: DEFINE_TESTPROC( test_cmdline )
279: {
280: //---------------------------------------------------------
281: // 定数 の テスト
282: //---------------------------------------------------------
283:
284: // 表示方法の指定があれば
285: {for( int i = 0; i < numof(params); ++i )
286: {
287: ASSERT( IsValidStringPtr( params[ i ].param ) );
288: ASSERT( IsValidStringPtr( params[ i ].style ) );
289: ASSERT( IsValidStringPtr( params[ i ].tiling ) );
290: }}
291:
292:
293: //---------------------------------------------------------
294: // ファイルスコープ関数 の テスト
295: //---------------------------------------------------------
296:
297: //---------------------------------------------------------
298: // 公開関数 の テスト
299: //---------------------------------------------------------
300:
301: }//test_cmdline
302:
303:
304: #endif // #ifdef _DEBUG
305:
306:
307: //** end **
参照:
水無瀬の部屋 > sample > goddess > goddess.cpp |
---|
このページは cpp2web が出力しました。
水無瀬 優 postmaster@katsura-kotonoha.sakura.ne.jp
http://katsura-kotonoha.sakura.ne.jp/prog/code/goddess/goddess_cpp.shtml
同人ダウンロード販売|DL.Getchu.com